From daf1ff839fc68ef31e3263780de4604a95118702 Mon Sep 17 00:00:00 2001
From: Andrew Burgess <andrew.burgess@embecosm.com>
Date: Thu, 23 Jul 2015 14:44:15 +0100
Subject: [PATCH 1/2] ld/arc: Provide the .tdata symbol.

When creating local dynamic tls access we rely on a .tdata symbol being
available to link against.  Normally, this is fine, as content is placed
into the .tdata section the linker makes a .tdata symbol available and
all is fine.

However, these linker created section symbols only exist for input
sections, not output sections, so, when we assemble with
-fdata-sections, and the content is placed not into '.tdata', but into
sections like, '.tdata.variable' we end up in a situation where there is
no input section called '.tdata', and so the linker does not create a
symbol called '.tdata' for us, at which point the link fails.

The solution it to have the linker script explicitly provide the symbol
'.tdata', this should ensure that the symbol is always available.

ld/ChangeLog:

	* scripttempl/arclinux.sc (.tdata): Provide the .tdata symbol.

ld/testsuite/ChangeLog:

	* ld/testsuite/ld-arc/arc.exp: Run new test.
	* ld/testsuite/ld-arc/tls-data-sections.d: New file.
	* ld/testsuite/ld-arc/tls-data-sections.s: New file.
---
 ld/ChangeLog.ARC                        |  4 ++++
 ld/scripttempl/arclinux.sc              |  2 +-
 ld/testsuite/ChangeLog.ARC              |  6 ++++++
 ld/testsuite/ld-arc/arc.exp             |  1 +
 ld/testsuite/ld-arc/tls-data-sections.d | 12 ++++++++++++
 ld/testsuite/ld-arc/tls-data-sections.s | 30 ++++++++++++++++++++++++++++++
 6 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 ld/testsuite/ld-arc/tls-data-sections.d
 create mode 100644 ld/testsuite/ld-arc/tls-data-sections.s

diff --git a/ld/ChangeLog.ARC b/ld/ChangeLog.ARC
index fac6f48..0006bb3 100644
--- a/ld/ChangeLog.ARC
+++ b/ld/ChangeLog.ARC
@@ -1,3 +1,7 @@
+2015-07-23  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* scripttempl/arclinux.sc (.tdata): Provide the .tdata symbol.
+
 2015-03-26: Claudiu Zissulescu <claziss@synopsys.com>
 
 	* testsuite/ld-arc/sda_relocs.d: New file.
diff --git a/ld/scripttempl/arclinux.sc b/ld/scripttempl/arclinux.sc
index 9d43ca3..1385b30 100644
--- a/ld/scripttempl/arclinux.sc
+++ b/ld/scripttempl/arclinux.sc
@@ -326,7 +326,7 @@ cat <<EOF
   .data1        ${RELOCATING-0} : { *(.data1) }
   /* TLS local dynamic uses .tdata as a reference point.  */
   ${RELOCATING+${CREATE_SHLIB+PROVIDE_HIDDEN (.tdata = .);}}
-  .tdata	${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
+  .tdata	${RELOCATING-0} : { PROVIDE_HIDDEN(.tdata = .); *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
   .tbss		${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
   .eh_frame     ${RELOCATING-0} : { KEEP (*(.eh_frame)) }
   .gcc_except_table ${RELOCATING-0} : { *(.gcc_except_table) }
diff --git a/ld/testsuite/ChangeLog.ARC b/ld/testsuite/ChangeLog.ARC
index b6d3eff..79f7ea9 100644
--- a/ld/testsuite/ChangeLog.ARC
+++ b/ld/testsuite/ChangeLog.ARC
@@ -1,3 +1,9 @@
+2015-07-23  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* ld/testsuite/ld-arc/arc.exp: Run new test.
+	* ld/testsuite/ld-arc/tls-data-sections.d: New file.
+	* ld/testsuite/ld-arc/tls-data-sections.s: New file.
+
 2015-06-06  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* ld-arc/unaligned-pc32.d: New file.
diff --git a/ld/testsuite/ld-arc/arc.exp b/ld/testsuite/ld-arc/arc.exp
index d2bfafe..74ab458 100644
--- a/ld/testsuite/ld-arc/arc.exp
+++ b/ld/testsuite/ld-arc/arc.exp
@@ -47,3 +47,4 @@ if {[check_shared_lib_support]} {
 
 run_dump_test "sda_relocs"
 run_dump_test "unaligned-pc32"
+run_dump_test "tls-data-sections"
diff --git a/ld/testsuite/ld-arc/tls-data-sections.d b/ld/testsuite/ld-arc/tls-data-sections.d
new file mode 100644
index 0000000..9823bf0
--- /dev/null
+++ b/ld/testsuite/ld-arc/tls-data-sections.d
@@ -0,0 +1,12 @@
+#source: tls-data-sections.s
+#ld: --entry=main
+#objdump: -rd
+
+
+.*:     file format elf32-littlearc
+
+
+Disassembly of section \.text:
+
+00010094 <main>:
+   10094:	00 21 80 3f 00 00 08 00 	add        r0,r25,8
diff --git a/ld/testsuite/ld-arc/tls-data-sections.s b/ld/testsuite/ld-arc/tls-data-sections.s
new file mode 100644
index 0000000..f0450c0
--- /dev/null
+++ b/ld/testsuite/ld-arc/tls-data-sections.s
@@ -0,0 +1,30 @@
+        /* This file is not intended to be real code, however, the
+           contents of the main function is real code as generated as
+           part of a local dynamic tls model access.  The purpose of
+           this test is to check that such an access will link
+           correctly.
+
+           Notice that the relocation in main references '.tdata', and
+           though we put content into '.tdata.pgsz.1362' we don't
+           create a '.tdata' section.  This is intentional, this example
+           was generated using -fdata-sections.
+
+           The '.tdata' section will be created in the linker script,
+           and we do expect to be able to reference it.  This should link.
+        */
+
+        .section ".text", "ax"
+        .global main, _start
+_start: 
+        .type   main, @function
+main:
+        add r0,pcl,@.tdata@tlsgd                ;8
+        .size   main, .-main
+
+        .section        .tdata.pgsz.1362,"awT",@progbits
+        .align 8
+        .type   pgsz.1362, @object
+        .size   pgsz.1362, 4
+
+pgsz.1362:
+        .word   1
-- 
2.4.3

